Tableau Desktop パフォーマンス記録機能を活用してレスポンスを最適化する

Tableau Desktop パフォーマンス記録機能を活用してレスポンスを最適化する

Clock Icon2024.11.13

AWS事業本部コンサルティング部の石川です。Tableauでダッシュボードを作成した後、思ったより動作が遅いと感じることはありませんか?そんな時に役立つのが、Tableauのパフォーマンス記録機能です。この機能を使えば、ワークブックのどの部分に時間がかかっているのかを特定し、効果的な最適化が可能になります。

Tableauのパフォーマンス記録機能とは

パフォーマンス記録機能は、ワークブックの操作中に発生するイベントのパフォーマンス情報を記録する機能です。クエリの実行時間、レイアウト計算、レンダリング時間など、様々な指標を収集し、パフォーマンスのボトルネックを特定するのに役立ちます。

取得できる情報とその活用方法

これらの情報を分析することで、ワークブックのどの部分に最適化の余地があるかを特定し、効果的な改善策を講じることができます。

パフォーマンス記録で取得できる主な情報と、その活用方法は以下の通りです:

  • データソース接続時間 (Connecting Data Source time)
    • データソースへの接続に要した時間です。
    • 接続に時間がかかる場合、ネットワークやデータベースサーバーの問題を調査する。
  • コンパイルクエリ時間 (Compile query time)
    • データソースに対して実行するクエリを生成に要した時間です。
    • 複雑なフィルター計算式や条件を簡素化する
  • クエリ実行時間 (Query execution time)
    • クエリの実行時間です。
    • 長時間かかるクエリを特定し、データソースの最適化やデータソースの見直しを行う。
  • レイアウト計算時間 (Layout computation time)
    • ダッシュボードやワークシートの構造を計算するプロセスを指し、ビジュアライゼーションの配置、サイズ調整、フォーマットなどの計算時間です。
    • 複雑なレイアウトを簡素化する。
  • レンダリング時間 (Rendering time)
    • ビジュアライゼーションを画面上にレンダリングする時間です。
    • 複雑なビジュアライゼーションを簡素化する。

パフォーマンス記録の手順

今回は、Tableau Desktop から クラウドDWHであるAmazon Redshiftへ接続する構成を例に解説します。なお、同じクエリをRedshiftで実行するとキャッシュされたクエリの結果返るため、今回は、データソースの設定の「初期 SQL」で、キャッシュ機能を無効化する設定を追加しています。

tableau-profiling-for-optimize-response-5

パフォーマンス記録するには、パフォーマンスの記録の開始した後、調査したい操作を実行パフォーマンスの記録を終了します。パフォーマンス記録結果を含むワークブックが自動的に作成、表示されます。

[ヘルプ] - [設定とパフォーマンス] - [パフォーマンスの記録の開始] を選択します。

tableau-profiling-for-optimize-response-1

フィルターの適用やダッシュボードの切り替えなど、調査したい操作を実行します。Tableauは、インメモリデータベースにキャッシュしたデータを利用するように設計されているため、今回がデータをリロードします。なお、macOS環境では「command + R」、Windows環境では「Ctrl + R」でリロードできます。

tableau-profiling-for-optimize-response-2

[ヘルプ] - [設定とパフォーマンス] - [パフォーマンスの記録の停止] を選択します。

tableau-profiling-for-optimize-response-3

パフォーマンス記録結果を含むワークブックが作成、自動的に別のTableau Desktopが表示されます。デフォルトでは、Performance Summary ダッシュボードが表示されます。

tableau-profiling-for-optimize-response-4

Detailed Views ダッシュボードでは、タイムラインやイベント毎の処理時間を確認できます。

tableau-profiling-for-optimize-response-6

Redshiftに発行しているクエリの確認方法

Tableauが Redshift に発行しているクエリを確認するには、パフォーマンス記録ワークブックの「Executing Query」イベントをクリックすると、「Query」セクションに実行されたSQLクエリが表示されます。

tableau-profiling-for-optimize-response-7

このクエリを選択して、テキストエディタに表示すると、ダブルクオーテーションがエスケープされた文字として取得されます。

Command
"SELECT ""t0"".""catdesc"" AS ""catdesc"",
  ""t0"".""catgroup"" AS ""catgroup"",
  ""t0"".""city"" AS ""city"",
  ""t0"".""state"" AS ""state"",
  ""t0"".""username"" AS ""username"",
  SUM(""listing"".""totalprice"") AS ""sum:totalprice:ok""
FROM ""public"".""listing"" ""listing""
  INNER JOIN (
  SELECT ""listing"".""listid"" AS ""listid (listing)"",
    ""category"".""catdesc"" AS ""catdesc"",
    ""category"".""catgroup"" AS ""catgroup"",
    ""users"".""city"" AS ""city"",
    ""users"".""state"" AS ""state"",
    ""users"".""username"" AS ""username""
  FROM ""public"".""listing"" ""listing""
    INNER JOIN ""public"".""sales"" ""sales"" ON (""listing"".""listid"" = ""sales"".""listid"")
    INNER JOIN ""public"".""event"" ""event"" ON (""sales"".""eventid"" = ""event"".""eventid"")
    INNER JOIN ""public"".""category"" ""category"" ON (""event"".""catid"" = ""category"".""catid"")
    LEFT JOIN ""public"".""users"" ""users"" ON (""sales"".""salesid"" = ""users"".""userid"")
  WHERE ((NOT (""category"".""catgroup"" IS NULL)) AND (CASE WHEN (""users"".""state"" = 'AB') THEN FALSE ELSE TRUE END))
  GROUP BY 2,
    3,
    4,
    1,
    5,
    6
) ""t0"" ON (""listing"".""listid"" = ""t0"".""listid (listing)"")
GROUP BY 1,
  2,
  3,
  4,
  5"

ちょっと手間がかかりますが、以下のように編集することで実行することができるSQLを取り出せます。

SELECT "t0"."catdesc" AS "catdesc",
  "t0"."catgroup" AS "catgroup",
  "t0"."city" AS "city",
  "t0"."state" AS "state",
  "t0"."username" AS "username",
  SUM("listing"."totalprice") AS "sum:totalprice:ok"
FROM "public"."listing" "listing"
  INNER JOIN (
  SELECT "listing"."listid" AS "listid (listing)",
    "category"."catdesc" AS "catdesc",
    "category"."catgroup" AS "catgroup",
    "users"."city" AS "city",
    "users"."state" AS "state",
    "users"."username" AS "username"
  FROM "public"."listing" "listing"
    INNER JOIN "public"."sales" "sales" ON ("listing"."listid" = "sales"."listid")
    INNER JOIN "public"."event" "event" ON ("sales"."eventid" = "event"."eventid")
    INNER JOIN "public"."category" "category" ON ("event"."catid" = "category"."catid")
    LEFT JOIN "public"."users" "users" ON ("sales"."salesid" = "users"."userid")
  WHERE ((NOT ("category"."catgroup" IS NULL)) AND (CASE WHEN ("users"."state" = 'AB') THEN FALSE ELSE TRUE END))
  GROUP BY 2,
    3,
    4,
    1,
    5,
    6
) "t0" ON ("listing"."listid" = "t0"."listid (listing)")
GROUP BY 1,
  2,
  3,
  4,
  5
;

応用: クエリからデータマートを作成する

パフォーマンス記録で特定した頻繁に実行される重いクエリがある場合、そのクエリ結果をデータマートとして事前に作成しておくことで、パフォーマンスを大幅に改善できる可能性があります。

  1. パフォーマンス記録から頻繁に実行される重いクエリを特定
  2. 上記の取り出したクエリからRedshiftの新しいテーブル(いわゆるデータマート)として作成(CREATE TABLE AS SELECT ...)
  3. データマートを用いたデータソースを作成、既存のワークブックのデータソースを置換

この方法により、複雑な計算やジョインをあらかじめ実行しておくことで、ダッシュボードの応答時間を大幅に短縮できます。

最後に

Tableauのパフォーマンス記録機能は、ダッシュボードの動作速度を改善する上でよく考え抜かれたツールです。この機能を活用することで、ワークブックのどの部分に時間がかかっているかを詳細に把握し、効果的な最適化を行うことができます。

ただし、パフォーマンスの最適化は、データ量、クエリの複雑さ、ユーザーの利用パターンなど、様々な要因を考慮しながら、継続的に改善を重ねていく必要があります。また、Redshiftとの連携を最適化する際は、Redshift側の設定も併せて検討することで、さらなるパフォーマンス向上が期待できます。

パフォーマンス記録機能を定期的に使用し、ユーザー体験を向上させるためのワークブック最適化を継続的に行うことで、より効率的で応答性の高いTableauダッシュボードを提供することができるでしょう。この機能を活用し、データ分析環境の改善に取り組むことをお勧めします。

かなり、前にはなりますが、Tableauのパフォーマンス改善のブログをまとめておりますので、ご参考にしてください。

https://dev.classmethod.jp/articles/tuning-your-amazon-redshift-and-tableau-software-development-for-better-performance-v2-1/

https://dev.classmethod.jp/articles/tuning-your-amazon-redshift-and-tableau-software-development-for-better-performance-v2-2/

https://dev.classmethod.jp/articles/tuning-your-amazon-redshift-and-tableau-software-development-for-better-performance-v2-3/

https://dev.classmethod.jp/articles/tuning-your-amazon-redshift-and-tableau-software-development-for-better-performance-v2-4/

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.